package cc.siyecao.mapper.conditions;

import cc.siyecao.mapper.Criteria;
import cc.siyecao.mapper.common.util.StringUtils;
import cc.siyecao.mapper.enums.SqlKeyword;
import cc.siyecao.mapper.enums.SqlLike;
import cc.siyecao.mapper.wrapper.IWrapper;

import java.util.Arrays;
import java.util.List;
import java.util.function.Function;

import static java.util.stream.Collectors.joining;

public interface StringCondition<W> extends IWrapper<W> {

    /**
     * 普通查询条件
     *
     * @param condition 是否执行
     * @param column    条件sql
     */

    default W addCondition(boolean condition, String column, SqlKeyword sqlKeyword) {
        return maybeDo( condition, () -> getCriteria().addCriterion( column, sqlKeyword ) );
    }

    /**
     * 普通查询条件
     *
     * @param condition 是否执行
     * @param column    条件sql
     */

    default W addCondition(boolean condition, String column, SqlKeyword sqlKeyword, Object value) {
        return maybeDo( condition, () -> getCriteria().addCriterion( column, sqlKeyword, value ) );
    }

    /**
     * BETWEEN查询条件
     *
     * @param condition  是否执行
     * @param column     属性
     * @param sqlKeyword SQL 关键词
     * @param val1       条件值1
     * @param val2       条件值2
     */

    default W addCondition(boolean condition, String column, SqlKeyword sqlKeyword, Object val1, Object val2) {
        return maybeDo( condition, () -> getCriteria().addCriterion( column, sqlKeyword, val1, val2 ) );
    }

    /**
     * 普通查询条件
     *
     * @param condition  是否执行
     * @param column     属性
     * @param sqlKeyword SQL 关键词
     * @param values     条件值
     */

    default W addCondition(boolean condition, String column, SqlKeyword sqlKeyword, Object... values) {
        return addCondition( condition, column, sqlKeyword, Arrays.asList( values ) );
    }

    default W addCondition(boolean condition, String applySql) {
        return maybeDo( condition, () -> getCriteria().addCriterion( applySql ) );
    }

//    /**
//     * 获取 columnNames
//     */
//    default String columnsName(String... columns) {
//        return Arrays.stream( columns ).collect( joining( COMMA ) );
//    }
//
//    /**
//     * 多字段转换为逗号 "," 分割字符串
//     *
//     * @param columns 多字段
//     */
//    default String columnsName(List<String> columns) {
//        return columns.stream().collect( joining( COMMA ) );
//    }

    Criteria getCriteria();
}
